package Builder; import java.util.ArrayList; import javax.media.opengl.GL2; import Common.Vector3f; import LDraw.Support.type.LDrawGridTypeT; public class Baseplate { private float startx; private float finishx; private float starty; private float finishy; private float height; private MainCamera camera; private int slice = 12; private float adjustedStartx; private float adjustedFinishx; private float adjustedStarty; private float adjustedFinishy; public Baseplate(MainCamera camera) { height = 0; startx = -240; finishx = 240; starty = -240; finishy = 240; adjustedStartx = startx; adjustedFinishx = finishx; adjustedStarty = starty; adjustedFinishy = finishy; this.camera = camera; } private final int unitSize = LDrawGridTypeT.Coarse.getXZValue(); public void draw(GL2 gl2) { slice = (int) (12 * 300.0f / camera.getDistanceBetweenObjectToCamera()); if (slice > 24) slice = 24; if (slice < 4) slice = 4; // slice = (4, 23) // 4�϶� ���� �� �״�� ���. adjustedStartx = startx; adjustedFinishx = finishx; adjustedStarty = starty; adjustedFinishy = finishy; if (adjustedStartx < -120 * (26 - slice) + camera.getLookAtPos().x) adjustedStartx = -120 * (26 - slice) + camera.getLookAtPos().x; if (adjustedFinishx > 120 * (26 - slice) + camera.getLookAtPos().x) adjustedFinishx = 120 * (26 - slice) + camera.getLookAtPos().x; if (adjustedStarty < -120 * (26 - slice) + camera.getLookAtPos().z) adjustedStarty = -120 * (26 - slice) + camera.getLookAtPos().z; if (adjustedFinishy > 120 * (26 - slice) + camera.getLookAtPos().z) adjustedFinishy = 120 * (26 - slice) + camera.getLookAtPos().z; if (BuilderConfigurationManager.getInstance().isUseConnectivity()) gl2.glColor4f(0.5f, 0.5f, 0.5f, 0.5f); else gl2.glColor4f(0.5f, 0.5f, 0.5f, 0.1f); if (slice == 4) { gl2.glPointSize((12 * 300.0f / camera.getDistanceBetweenObjectToCamera())); gl2.glBegin(GL2.GL_POINTS); // draw using triangles for (Vector3f vertex : getPointVertices()) gl2.glVertex3f(vertex.x, vertex.y, vertex.z); gl2.glEnd(); gl2.glPointSize(1); } else { // Draw Stud Disk (possible styles: FILL, LINE, POINT). // gl2.glBegin(GL2.GL_QUADS); // draw using triangles // for (Vector3f vertex : getCylinderVertices()) // gl2.glVertex3f(vertex.x, vertex.y, vertex.z); // gl2.glEnd(); gl2.glBegin(GL2.GL_TRIANGLES); for (Vector3f vertex : getDiskVertices()) gl2.glVertex3f(vertex.x, vertex.y, vertex.z); gl2.glEnd(); } } private Vector3f[] getPointVertices() { int width = (int) (adjustedFinishx - adjustedStartx); int height = (int) (adjustedFinishy - adjustedStarty); height /= unitSize; width /= unitSize; ArrayList<Vector3f> vertices = new ArrayList<Vector3f>(); Vector3f vertex; for (int column = 0; column < height; column += 1) { for (int row = 0; row < width; row += 1) { vertex = new Vector3f(LDrawGridTypeT.Coarse.getXZValue() - LDrawGridTypeT.Coarse.getXZValue() / 2 + LDrawGridTypeT.Coarse.getXZValue() * row, 0, -LDrawGridTypeT.Coarse.getXZValue() / 2 - LDrawGridTypeT.Coarse.getXZValue() * (column)); vertices.add(vertex); } } Vector3f[] retArray = new Vector3f[vertices.size()]; for (int i = 0; i < vertices.size(); i++) { retArray[i] = vertices.get(i).add(adjustedStartx, 0, adjustedFinishy); } return retArray; } private Vector3f[] getDiskVertices() { int width = (int) (adjustedFinishx - adjustedStartx); int height = (int) (adjustedFinishy - adjustedStarty); height /= unitSize; width /= unitSize; ArrayList<Vector3f> vertices = new ArrayList<Vector3f>(); final float diskRadius = LDrawGridTypeT.Medium.getXZValue() / 1.6f; final float diskHeight = -LDrawGridTypeT.Fine.getYValue() * 2; Vector3f vertex; for (int column = 0; column < height; column += 1) { for (int row = 0; row < width; row += 1) { vertex = new Vector3f(LDrawGridTypeT.Coarse.getXZValue() - LDrawGridTypeT.Coarse.getXZValue() / 2 + LDrawGridTypeT.Coarse.getXZValue() * row, 0, -LDrawGridTypeT.Coarse.getXZValue() / 2 - LDrawGridTypeT.Coarse.getXZValue() * (column)); for (int sliceIndex = 0; sliceIndex < slice - 1; sliceIndex++) { vertices.add(vertex); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex) * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (diskRadius * Math.cos((sliceIndex + 1) * Math.PI * 2 / (slice - 1))), 0, (float) (diskRadius * Math.sin((sliceIndex + 1) * Math.PI * 2 / (slice - 1))))); } } } Vector3f[] retArray = new Vector3f[vertices.size()]; for (int i = 0; i < vertices.size(); i++) { retArray[i] = vertices.get(i).add(adjustedStartx, 0, adjustedFinishy); } return retArray; } private Vector3f[] getCylinderVertices() { ArrayList<Vector3f> vertices = new ArrayList<Vector3f>(); int width = (int) (adjustedFinishx - adjustedStartx); int height = (int) (adjustedFinishy - adjustedStarty); height /= unitSize; width /= unitSize; final float cylinderRadius = LDrawGridTypeT.Medium.getXZValue() / 1.6f; final float cylinderHeight = -LDrawGridTypeT.Fine.getYValue() * 2; Vector3f vertex; for (int column = 0; column < height; column++) { for (int row = 0; row < width; row++) { vertex = new Vector3f(LDrawGridTypeT.Coarse.getXZValue() - LDrawGridTypeT.Coarse.getXZValue() / 2 + LDrawGridTypeT.Coarse.getXZValue() * (row), 0, -LDrawGridTypeT.Coarse.getXZValue() / 2 - LDrawGridTypeT.Coarse.getXZValue() * (column)); for (int sliceIndex = 0; sliceIndex < slice - 1; sliceIndex++) { vertices.add(vertex.add( (float) (cylinderRadius * Math.cos(sliceIndex * Math.PI * 2 / (slice - 1))), 0, (float) (cylinderRadius * Math.sin(sliceIndex * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (cylinderRadius * Math.cos((sliceIndex + 1) * Math.PI * 2 / (slice - 1))), 0, (float) (cylinderRadius * Math.sin((sliceIndex + 1) * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (cylinderRadius * Math.cos((sliceIndex + 1) * Math.PI * 2 / (slice - 1))), cylinderHeight, (float) (cylinderRadius * Math.sin((sliceIndex + 1) * Math.PI * 2 / (slice - 1))))); vertices.add(vertex.add( (float) (cylinderRadius * Math.cos(sliceIndex * Math.PI * 2 / (slice - 1))), cylinderHeight, (float) (cylinderRadius * Math.sin(sliceIndex * Math.PI * 2 / (slice - 1))))); } } } Vector3f[] retArray = new Vector3f[vertices.size()]; for (int i = 0; i < vertices.size(); i++) { retArray[i] = vertices.get(i).add(adjustedStartx, 0, adjustedFinishy); } return retArray; } public void setRange(float[] range) { if (range[0] > -240) range[0] = -240; if (range[1] < 240) range[1] = 240; if (range[2] > -240) range[2] = -240; if (range[3] < 240) range[3] = 240; if (range[4] >= 3.40282347E+38f) range[4] = 0; if (range[5] <= -3.40282347E+38f) range[5] = 0; for (int i = 0; i < 4; i++) { int r = Math.round(range[i] / unitSize); if (r < 0) r -= 2; else r += 1; range[i] = (float) r * unitSize; } startx = range[0]; finishx = range[1]; starty = range[2]; finishy = range[3]; height = range[5]; } public float getStartx() { return startx; } public void setStartx(float startx) { this.startx = startx; } public float getFinishx() { return finishx; } public void setFinishx(float finishx) { this.finishx = finishx; } public float getStarty() { return starty; } public void setStarty(float starty) { this.starty = starty; } public float getFinishy() { return finishy; } public void setFinishy(float finishy) { this.finishy = finishy; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; } }